#ifndef RSA_H_
#define RSA_H_

#include <string>
#include <fstream>
#include "ClaveRSA.h"
#include <math.h>
#include "NumerosPrimos.h"

using namespace std;

namespace Encriptacion {

class RSA {

private:

	bool abrirArchivo(fstream& archivo, string path, bool crearNuevo);
	bool generarEncriptacion(string nombreDelArchivoOriginal, string nombreDelArchivoResultado, ClaveRSA* clave);
	bool generarDesencriptacion(string nombreDelArchivoOriginal, string nombreDelArchivoResultado, ClaveRSA* clave);

public:

	RSA();

	string generarParDeClaves(string nombreDelAdmin);
	string encriptarArchivo(string nombreDelAdmin, string pathDelArchivo, string entidad);
	string desencriptarArchivo(string nombreDelAdmin, string pathDelArchivo);
	string desencriptarArchivo(ClaveRSA* claveParaDesencriptar, string pathDelArchivoEncriptado,string pathDelArchivoDesencriptado);

	// operaciones auxiliares
	unsigned long long exponenciacionModular(unsigned long long c, unsigned long long e, unsigned long long n);
	unsigned long long algoritmoExtendidoDeEuclides(unsigned long long numero, unsigned long long modulo);
	unsigned long long obtenerMaximoComunDivisor(unsigned long long a, unsigned long long b);
	unsigned long long obtenerNumeroRelativamentePrimoA(unsigned long long numero);

	virtual ~RSA();
};

}

#endif
